package com.aw.baselib.util

import java.math.BigDecimal
import java.text.DecimalFormat
import java.text.NumberFormat

/**
 * Created by hzw
 */
object AwConvertUtil {
    /**
     * 将double转为数值，并最多保留num位小数。例如当num为2时，1.268为1.27，1.2仍为1.2；1仍为1，而非1.00;100.00则返回100.00。
     *
     * @param d
     * @param num 小数位数
     * @return
     */
    fun double2String(d: Double, num: Int): String {
        val nf = NumberFormat.getNumberInstance()
        nf.maximumFractionDigits = num //保留两位小数
        nf.isGroupingUsed = false //去掉数值中的千位分隔符
        var temp = nf.format(d)
        if (temp.contains(".")) {
            val s1 = temp.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0]
            val s2 = temp.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1]
            for (i in s2.length downTo 1) {
                if (s2.substring(i - 1, i) != "0") {
                    return s1 + "." + s2.substring(0, i)
                }
            }
            return s1
        } else {
            val stringBuffer = StringBuffer()
            if (num > 0) {
                for (i in 0 until num) {
                    stringBuffer.append("0")
                }
                temp = "$temp.$stringBuffer"
            }
        }
        return temp
    }

    /**
     * 将double转为数值，并最多保留num位小数。
     *
     * @param d
     * @param num 小数个数
     * @param defValue 默认值。当d为null时，返回该值。
     * @return
     */
    fun double2String(d: Double?, num: Int, defValue: String): String {
        return if (d == null) {
            defValue
        } else double2String(d, num)
    }

    fun rvZeroAndDot(s: String): String? {
        var s = s
        if (s.isEmpty()) {
            return null
        }
        if (s.indexOf(".") > 0) {
            s = s.replace("0+?$".toRegex(), "") //去掉多余的0
            s = s.replace("[.]$".toRegex(), "") //如最后一位是.则去掉
        }
        return s
    }

    fun removeDotLast(s: String): String {
        if (AwDataUtil.isEmpty(s)) {
            return ""
        }
        return if (s.contains(".")) {
            val s0 = s.split(".".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0]
            var s1 = s.split(".".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1]
            if (s1.length > 2) {
                s1 = s1.substring(0, 1)
            }
            s0 + s1
        } else {
            s
        }
    }

    /**
     * 相除保留2位小数
     * @param v1
     * @param v2
     * @return
     */
    fun getDivResult(v1: Double, v2: Double): String {
        return String.format("%.2f", v1 / v2 * 100)
    }

    fun div(v1: Double, v2: Double): String {
        val result = v1 / v2
        val df = DecimalFormat("#.00")
        return df.format(result)
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     * 定精度，以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    fun div(v1: Double, v2: Double, scale: Int): Double {
        require(scale >= 0) { "The scale must be a positive integer or zero" }
        val b1 = BigDecimal(java.lang.Double.toString(v1))
        val b2 = BigDecimal(java.lang.Double.toString(v2))
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
    }

    fun div(v1: String?, v2: Double, scale: Int): Double {
        if (AwDataUtil.isEmpty(v1)) {
            return 0.0
        }
        require(scale >= 0) { "The scale must be a positive integer or zero" }
        val b1 = BigDecimal(v1)
        val b2 = BigDecimal(java.lang.Double.toString(v2))
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
    }

    fun divFloat(v1: Int, v2: Int, scale: Int): Float {
        if (scale < 0) {
            return 0f
        }
        val b1 = BigDecimal(java.lang.Double.toString(v1.toDouble()))
        val b2 = BigDecimal(java.lang.Double.toString(v2.toDouble()))
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toFloat()
    }
}